package main

import (
	"Learn/main/chatroom/common/message"
	"encoding/binary"
	"encoding/json"
	"fmt"
	"net"
)

// 登录校验函数
func login(userId int, userPwd string) (err error) {
	// 开始定协议
	fmt.Printf("userId = %d userPwd = %s\n", userId, userPwd)

	//return nil
	// 1、连接到服务器端
	conn, err := net.Dial("tcp", "localhost:8889")
	if err != nil {
		fmt.Println("net.Dial err=", err)
		return
	}
	// 延时关闭
	defer conn.Close()
	// 2、准备通过 conn 发送消息给服务器
	var mes message.Message
	mes.Type = message.LoginMesType
	// 3、创建LoginMes结构体
	var loginMes message.LoginMes
	loginMes.UserId = userId
	loginMes.UserPwd = userPwd
	// 4、将loginMes序列化
	marshal, err := json.Marshal(loginMes)
	if err != nil {
		fmt.Println("json.Marshal err=", err)
		return
	}
	// 5、把marshal赋给 mes.Data 字段
	mes.Data = string(marshal)
	// 6、将 mes 进行序列化
	data, err := json.Marshal(mes)
	if err != nil {
		fmt.Println("json.Marshal err=", err)
		return err
	}
	// 7、到这个时候，data 就是我们要发送的消息
	// 7.1 先把 data 的长度发送给服务器
	// 先获取到 data 的长度 -> 转成一个表示长度的 byte 切片
	var pkgLen uint32
	pkgLen = uint32(len(data))
	var buf [4]byte
	binary.BigEndian.PutUint32(buf[0:4], pkgLen)
	n, err := conn.Write(buf[:4])
	if n != 4 || err != nil {
		fmt.Println("conn.Write(buf) fail", err)
		return err
	}

	fmt.Printf("客户端，发送消息的长度=%d 内容=%s", len(data), string(data))
	// 发送消息本身
	_, err = conn.Write(data)
	if err != nil {
		fmt.Println("conn.Write(data) fail", err)
		return err
	}

	// 休眠 20s
	//time.Sleep(20 * time.Second)
	//fmt.Println("休眠 20s")

	// 这里还需要处理服务端返回的消息
	msg, err := readPkg(conn)
	if err != nil {
		fmt.Println("readPkg(data) fail", err)
		return err
	}
	// 反序列化 msg.Data 为 LoginResMsg 结构体
	var loginResMes message.LoginResMsg
	err = json.Unmarshal([]byte(msg.Data), &loginResMes)
	if err != nil {
		return err
	}
	if loginResMes.Code == 200 {
		fmt.Println("登录成功")
	} else if loginResMes.Code == 500 {
		fmt.Println(loginResMes.Error)
	}
	return err
}
